import express from 'express';
import cors from 'cors';
import dotenv from 'dotenv';
import detectRouter from './routes/detect';
import { WebSocketServer } from 'ws';
import http from 'http';

// 加载环境变量
dotenv.config();
const app = express();
const port = Number(process.env.PORT) || 9081;

// CORS 配置
const corsOptions = {
    origin: '*', // 允许所有来源访问，生产环境建议设置具体的域名
    methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
    allowedHeaders: ['Content-Type', 'Authorization', 'X-Requested-With', 'Accept', 'Origin'],
    exposedHeaders: ['Content-Range', 'X-Content-Range'],
    credentials: true, // 允许携带凭证
    maxAge: 86400 // 预检请求结果缓存时间，单位秒
};

// 中间件
app.use(cors(corsOptions));

// 增加请求体大小限制
app.use(express.json({ limit: '10gb' }));
app.use(express.urlencoded({ extended: true, limit: '10gb' }));

// 设置请求超时时间
app.use((req, res, next) => {
    // 设置超时时间为30分钟
    req.setTimeout(30 * 60 * 1000);
    res.setTimeout(30 * 60 * 1000);
    next();
});

// 测试路由
app.get('/', (req, res) => {
  res.send('这是铁科院的目标检测项目');
});

// 注册检测路由
app.use('/detect', detectRouter);

// 错误处理中间件
app.use((err: any, req: express.Request, res: express.Response, next: express.NextFunction) => {
    console.error(err.stack);
    res.status(500).json({
        success: false,
        message: '服务器内部错误',
        error: process.env.NODE_ENV === 'development' ? err.message : '未知错误'
    });
});

// 创建 HTTP 服务器实例
const server = http.createServer(app);

// 启动 WebSocket 服务端
const wsServer = new WebSocketServer({port: 30002 });
wsServer.on('connection', (ws) => {
    console.log('WebSocket 客户端已连接');
    ws.on('close', () => {
        console.log('WebSocket 客户端断开连接');
    });
});

// 导出 wsServer 供其他模块使用
export { wsServer };

// 启动 HTTP+WebSocket 服务器
server.listen(port, '0.0.0.0', () => {
    console.log(`服务器运行在 http://localhost:${port}`);
    console.log('WebSocket 服务端运行在 ws://localhost:30002');
}); 